From: Tim Deegan Date: Thu, 10 Feb 2011 11:27:51 +0000 (+0000) Subject: x86/mm: shuffle log-dirty code so only one path allocates memory X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~10793 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22?a=commitdiff_plain;h=17f709bb8d30af86276d53b4da7534330dcc1e1f;p=xen.git x86/mm: shuffle log-dirty code so only one path allocates memory Signed-off-by: Tim Deegan --- diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 1436add2a3..da9d6573aa 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -132,17 +132,12 @@ static mfn_t paging_new_log_dirty_node(struct domain *d, mfn_t **node_p) return mfn; } -/* get the top of the log-dirty bitmap trie, allocating if necessary */ +/* get the top of the log-dirty bitmap trie */ static mfn_t *paging_map_log_dirty_bitmap(struct domain *d) { - mfn_t *mapping; - if ( likely(mfn_valid(d->arch.paging.log_dirty.top)) ) return map_domain_page(mfn_x(d->arch.paging.log_dirty.top)); - - d->arch.paging.log_dirty.top = paging_new_log_dirty_node(d, &mapping); - - return mapping; + return NULL; } static void paging_free_log_dirty_page(struct domain *d, mfn_t mfn) @@ -262,8 +257,12 @@ void paging_mark_dirty(struct domain *d, unsigned long guest_mfn) i4 = L4_LOGDIRTY_IDX(pfn); l4 = paging_map_log_dirty_bitmap(d); - if ( !l4 ) - goto out; + if ( unlikely(!l4) ) + { + d->arch.paging.log_dirty.top = paging_new_log_dirty_node(d, &l4); + if ( !l4 ) + goto out; + } mfn = l4[i4]; if ( !mfn_valid(mfn) ) mfn = l4[i4] = paging_new_log_dirty_node(d, &l3);